精通Linux系列十四:这个做好了出了意外真能救命(备份和远程存储)
精通Linux系列点击关注公众号,AI&编程干货及时送达
备份和远程存储
命令 | 解释 |
rsync | 高效地复制一组文件(即使跨网络) |
dd | 数据的低级复制。 |
有各种方式备份 Linux 文件:
• 将它们复制到备份介质,例如外部硬盘。
• 将它们刻录到可写入的 CD,DVD 或 Blu-ray 光盘。
• 将它们镜像到远程机器。
我们没有介绍所有的 Linux 备份命令。一些用户更喜欢 cpio
,因为它灵活,一些老的管理员则坚称 dump
和 restore
是唯一可靠的备份所有类型文件的方式。如果你对这些程序感兴趣,我会面会专门写一篇来解释。
rsync
stdin stdout - file -- opt --help --version
rsync [选项] 源 目标
rsync
命令复制一组文件。它可以做出完全相同的副本,包括文件权限和其他属性(称为镜像),或者它只是复制数据。它可以在网络上运行,也可以在单一机器上运行。rsync
有许多用途和超过50个选项;我们只会介绍一些与备份相关的常见用例。
在单个机器上,将目录 mydir 及其内容镜像到另一个目录 mydir2 中:
→ rsync -a mydir mydir2
rsync
对指定第一个目录很小心。如果你像这里的例子那样写 mydir
,那么该目录会被复制 进入 mydir2,创建 mydir2/mydir。这可能不是你想要的。如果你宁愿把 mydir 的 内容 复制到 mydir2 中,请在 mydir
后面添加一个斜线:
→ rsync -a mydir/ mydir2
如果你想在网络上将目录 mydir 镜像到另一个主机,server.example.com,假设你在那里有一个用户名为“smith”的账户。rsync
自动使用 SSH 安全连接,以防止窃听:
→ rsync -a mydir smith@server.example.com:D2
如果你喜欢使用 rsync
,但想要增量备份并高效地管理它们,可以查看 rsnapshot
(http://rsnapshot.org/)。
有用的选项
-o | 复制文件的所有者。(你可能需要在远程主机上拥有超级用户权限。) |
-g | 复制文件的组所有者。(你可能需要在远程主机上拥有超级用户权限。) |
-p | 复制文件权限。 |
-t | 复制文件时间戳。 |
-r | 递归复制目录(即包括它们的内容)。 |
-l | 允许复制符号链接(不是它们指向的文件)。 |
-D | 允许复制设备。(仅限超级用户。) |
-a | 镜像:复制原始文件的所有属性。这暗示了所有 -ogptrlD 的选项。 |
-x | 当复制文件树时,保持在当前文件系统内;不要跨越到其他已挂载的文件系统。 |
-n | 试运行模式:不要真正做任何复制。只是显示 会 做什么。 |
-v | 详细模式:打印在复制过程中发生的情况。添加 --progress 在复制文件时显示数字进度条。 |
dd
stdin stdout - file -- opt --help --version
dd [选项]
dd
是一种低级别的位和字节复制器。它可以将数据从一个文件复制到另一个文件,比如,从 file1 到 file2:
→ dd if=fileA of=fileC
7+1 条记录输入
7+1 条记录输出
3816 字节 (3.8 kB) 已复制,0.000356028 s, 10.7 MB/s
它甚至可以在复制时进行数据转换。例如,你可以在文件之间传输数据时将所有字符转换为大写:
→ dd if=fileA of=filecaps conv=ucase
7+1 条记录输入
7+1 条记录输出
3816 字节 (3.8 kB) 已复制,0.000389499 s, 9.8 MB/s
然而,dd
做的远不止复制文件。它可以通过从一个设备复制到另一个设备来克隆磁盘(警告!这将销毁目标设备上的所有数据!):
→ sudo dd if=/dev/device1 of=/dev/device2 bs=512 \
conv=noerror,sync
dd
在某种意义上是很简单的,因为只做 - 移动位 - 但它也很复杂,因为如果你不小心,你可以在几秒钟内 擦除你的硬盘。在作为超级用户使用 dd
之前,请备份你的电脑并。
访问 https://wiki.archlinux.org/index.php/Disk_cloning 以获取关于dd高级用法的一些建议。
我最喜欢的是将磁盘的主引导记录(MBR)复制到一个名为 mybootrecord 的文件中,其中MBR的长度为512字节:
→ sudo dd if=/dev/device of=mybootrecord bs=512 \
count=1
if=* 文件* | 指定一个输入文件或设备。 |
of=* 文件* | 指定一个输出文件或设备。 |
bs=* N* | 一次复制 *N *字节,这被称为“块大小”。(要为输入和输出设置不同的块大小,请分别使用 ibs 和 obs 。) |
skip=* N* | 在开始复制之前,跳过 *N *个输入块。 |
seek=* N* | 在开始复制之前,丢弃 *N *个输出块。 |
conv=* spec* | 转换被复制的数据。*spec * 可以是 ucase (转换为大写)、lcase (转换为小写)、ascii (从EBCDIC转换为ASCII),以及在man手册页上列出的许多其他选项。 |
推荐阅读
你好,我是拾叁,7年开发老司机、互联网两年外企5年。怼得过阿三老美,也被PR comments搞崩溃过。这些年我打过工,创过业,接过私活,也混过upwork。赚过钱也亏过钱。一路过来,给我最深的感受就是不管学什么,一定要不断学习。只要你能坚持下来,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯和编程知识,帮你积累弯道超车的资本。